package com.ubiquando.api.server;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;

import com.google.appengine.api.datastore.KeyFactory;
import com.google.gson.stream.JsonWriter;
import com.ubiquando.api.server.db.Client;
import com.ubiquando.api.server.db.Dao;
import com.ubiquando.api.server.db.Event;
import com.ubiquando.api.server.db.EventMeeting;
import com.ubiquando.api.server.db.EventPickUp;
import com.ubiquando.api.server.db.PickupClient;

public class MyJsonWriter {

	
	private static final int OK = 100;
	private static final int ERROR = 101;
	
	public static void returnOK(PrintWriter pw) throws IOException{
		JsonWriter json = new JsonWriter(pw);
		json.beginObject();
		json.name("CODE");
		json.value(OK);
		json.endObject();
		
		json.flush();
	}
	
	public static void returnError(PrintWriter pw, String msg) throws IOException{
		JsonWriter json = new JsonWriter(pw);
		json.beginObject();
		json.name("CODE");
		json.value(ERROR);
		
		json.name("MSG");
		json.value(msg);
		json.endObject();
		
		json.flush();
	}

	public static void returnClientID(PrintWriter pw, String id) throws IOException {
//		System.out.println(id);
		JsonWriter json = new JsonWriter(pw);
		json.beginObject();
		json.name("CODE");
		json.value(OK);
		json.name("client_id");
		json.value(id);
		json.endObject();
		
		json.flush();
	}

	public static void returnMeetingEvent(PrintWriter pw, EventMeeting event) throws IOException {
		JsonWriter json = new JsonWriter(pw);
		sendMeetingEvent(json, event);
		json.flush();
	}

	public static void returnPickupEvent(PrintWriter pw, EventPickUp event) throws IOException {
		JsonWriter json = new JsonWriter(pw);
		sendPickupEvent(json, event);
		json.flush();
	}

	public static void returnWallet(PrintWriter pw, Client client) throws IOException {
		JsonWriter json = new JsonWriter(pw);
		json.beginObject();
		json.name("CLIENT");
		
		json.beginObject();
		json.name("id");
		json.value(KeyFactory.keyToString(client.getId()));
		json.name("name");
		json.value(client.getName());
		json.name("contacts");
		
		json.beginArray();
		Set<String> contacts = client.getContacts();
		for(String clientId:contacts){
			Client contact = Dao.INSTANCE.getClient(clientId);
			sendClient(json, contact);
		}
		json.endArray();
		
		json.name("events");
		
		json.beginArray();
		// meeting events
		Set<String> events = client.getMeetingEvents();
		for(String eventId:events){
			Event event = Dao.INSTANCE.getEvent(eventId, Event.MEETING_EVENT);
			//json.name("EVENT");
//			if(event.getType() == Event.MEETING_EVENT)
			if(event != null)
				sendMeetingEvent(json, (EventMeeting)event);
//			else if(event.getType() == Event.PICKUP_EVENT)
//				sendPickupEvent(json, (EventPickUp) event);
			else
				return;
		}
		//pickup events
		events = client.getPickupEvents();
		for(String eventId:events){
			Event event = Dao.INSTANCE.getEvent(eventId, Event.PICKUP_EVENT);
			//json.name("EVENT");
//			if(event.getType() == Event.MEETING_EVENT)
			if(event != null)
				sendPickupEvent(json, (EventPickUp)event);
//			else if(event.getType() == Event.PICKUP_EVENT)
//				sendPickupEvent(json, (EventPickUp) event);
			else
				return;
		}
		
		json.endArray();
		
		json.endObject();
		json.endObject();
		
		json.flush();
	}
	
	private static void sendMeetingEvent(JsonWriter json, EventMeeting event) throws IOException{
		json.beginObject();
		json.name("MEETING_EVENT");
		
		json.beginObject();
		
		json.name("id");
		json.value(KeyFactory.keyToString(event.getId()));
//		json.name("type");
//		json.value(event.getType());
		json.name("name");
		json.value(event.getName());
		json.name("time");
		json.value(event.getTime());
		json.name("dest");
		json.value(event.getDest());
//		json.name("destName");
//		json.value(event.getDestName());
		json.name("creator");
		json.value(event.getCreatorId());
		json.name("started");
		json.value(event.isStarted());
		json.name("participants");
		
		json.beginArray();
		Set<String> participants = event.getParticipants();
		for(String clientId:participants){
			Client client = Dao.INSTANCE.getClient(clientId);
//			json.beginObject();
//			json.name("PARTICIPANT");
			sendClient(json, client);
//			json.value(clientId);
//			json.endObject();
		}
		json.endArray();
		
		json.name("pickups");
		
		json.beginArray();
		Set<String> pickups = event.getPickups(); 
		for(String pickupId:pickups){
			EventPickUp pickupEvent = (EventPickUp)Dao.INSTANCE.getEvent(pickupId, Event.PICKUP_EVENT);
//			json.beginObject();
//			json.name("PICKUP");
			sendPickupEvent(json, pickupEvent);
//			json.value(pickupId);
//			json.endObject();
		}
		json.endArray();
		json.endObject();
		json.endObject();
	}
	
	private static void sendPickupEvent(JsonWriter json, EventPickUp event) throws IOException{
		json.beginObject();
		json.name("PICKUP_EVENT");
		
		json.beginObject();
		
		json.name("id");
		json.value(KeyFactory.keyToString(event.getId()));
//		json.name("type");
//		json.value(event.getType());
		json.name("name");
		json.value(event.getName());
		json.name("time");
		json.value(event.getTime());
		json.name("dest");
		json.value(event.getDest());
//		json.name("destName");
//		json.value(event.getDestName());
		json.name("location");
		json.value(event.getLocation());
		json.name("pickerId");
		json.value(event.getPickerId());
		json.name("creator");
		json.value(event.getCreatorId());
		json.name("started");
		json.value(event.isStarted());
		json.name("participants");
		
		json.beginArray();
		Set<String> participants = event.getParticipants();
		for(String clientId:participants){
			PickupClient participant = Dao.INSTANCE.getPickupClient(clientId);
			sendPickupClient(json, participant);
//			json.beginObject();
//			json.name("participantId");
//			json.value(clientId);
//			json.endObject();
		}
		json.endArray();
		json.endObject();
		json.endObject();
	}
	
	private static void sendPickupClient(JsonWriter json,
			PickupClient participant) throws IOException {
		Client client = Dao.INSTANCE.getClient(participant.getClientId());
		if(client == null){
			//TODO return error
			return;
		}
		json.beginObject();
		json.name("PICKUP_CONTACT");
		json.beginObject();
		json.name("id");
		json.value(participant.getClientId());
//		json.name("name");
//		json.value(client.getName());
//		json.name("email");
//		json.value(client.getEmail());
		json.name("location");
		json.value(participant.getLocation());
//		json.name("locName");
//		json.value(participant.getLocName());
		json.name("time");
		json.value(participant.getTime());
		json.endObject();
		json.endObject();
	}

	private static void sendClient(JsonWriter json, Client client) throws IOException{
		json.beginObject();
		json.name("CONTACT");
		json.beginObject();
		json.name("id");
		json.value(KeyFactory.keyToString(client.getId()));
		json.name("name");
		json.value(client.getName());
		json.name("location");
		json.value(client.getLocation());
		json.name("email");
		json.value(client.getEmail());
		json.endObject();
		json.endObject();
	}

	public static void returnEventId(PrintWriter pw, String id) throws IOException {
		JsonWriter json = new JsonWriter(pw);
		json.beginObject();
		json.name("CODE");
		json.value(OK);
		json.name("event_id");
		json.value(id);
		json.endObject();
		
		json.flush();
		
	}

	public static void returnClient(PrintWriter pw, Client client) throws IOException {
		sendClient(new JsonWriter(pw), client);
	}
	
}
